/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package netwrokproject.transporte;

import java.util.ArrayDeque;

/**
 *
 * @author Clodoaldo
 */
public class MensagemTransporte {

    // ESTRUTURA ATUAL DAS MENSAGENS
    byte ipOrigem;                                      // 0-7
    byte portaOrigem;                                   // 8-15
    byte ipDestino;                                     // 16-23
    byte portaDestino;                                  // 24-31
    short sequencia;                                    // 32-47
    short ack;                                          // 48-63
    byte flags;                                         // 64-71
    ArrayDeque<Byte> dados = new ArrayDeque<Byte>();    // 72+

    public MensagemTransporte(byte ipOrigem, byte portaOrigem, byte ipDestino, byte portaDestino, short sequencia, short ack, byte flags, ArrayDeque<Byte> dados) {
        this.ipOrigem = ipOrigem;
        this.portaOrigem = portaOrigem;
        this.ipDestino = ipDestino;
        this.portaDestino = portaDestino;
        this.sequencia = sequencia;
        this.ack = ack;
        this.flags = flags;
        this.dados = dados.clone();
    }

    public MensagemTransporte(ArrayDeque<Byte> pacote) {
        this.ipOrigem = pacote.removeFirst();
        this.portaOrigem = pacote.removeFirst();
        this.ipDestino = pacote.removeFirst();
        this.portaDestino = pacote.removeFirst();

        short s1 = ((short)(pacote.removeFirst() << 8));
        short s2 = ((short)pacote.removeFirst());

        this.sequencia = ((short)(s1 | s2));

        short a1 = ((short)(pacote.removeFirst() << 8));
        short a2 = ((short)pacote.removeFirst());

        this.ack = ((short)(a1 | a2));

        this.flags = pacote.removeFirst();

        while (!pacote.isEmpty()){
            dados.addFirst(pacote.removeFirst());
        }
    }

    public ArrayDeque<Byte> toArrayDeque() {
        ArrayDeque<Byte> temp = new ArrayDeque<Byte>();
        temp.addLast(ipOrigem);
        temp.addLast(portaOrigem);
        temp.addLast(ipDestino);
        temp.addLast(portaDestino);

        byte seq1 = ((byte) ((sequencia & 65280) >> 8));
        byte seq2 = ((byte) (sequencia & 255));

        temp.addLast(seq1);
        temp.addLast(seq2);

        byte ack1 = ((byte) ((ack & 65280) >> 8));
        byte ack2 = ((byte) (ack & 255));

        temp.addLast(ack1);
        temp.addLast(ack2);

        temp.addLast(flags);

        while(!dados.isEmpty()) {
            temp.addLast(dados.removeFirst());
        }

        return temp;
    }

    // GETS E SETS

    public short getAck() {
        return ack;
    }

    public void setAck(short ack) {
        this.ack = ack;
    }

    public ArrayDeque<Byte> getDados() {
        return dados;
    }

    public void setDados(ArrayDeque<Byte> dados) {
        this.dados = dados;
    }

    public byte getFlags() {
        return flags;
    }

    public void setFlags(byte flags) {
        this.flags = flags;
    }

    public byte getIpDestino() {
        return ipDestino;
    }

    public void setIpDestino(byte ipDestino) {
        this.ipDestino = ipDestino;
    }

    public byte getIpOrigem() {
        return ipOrigem;
    }

    public void setIpOrigem(byte ipOrigem) {
        this.ipOrigem = ipOrigem;
    }

    public byte getPortaDestino() {
        return portaDestino;
    }

    public void setPortaDestino(byte portaDestino) {
        this.portaDestino = portaDestino;
    }

    public byte getPortaOrigem() {
        return portaOrigem;
    }

    public void setPortaOrigem(byte portaOrigem) {
        this.portaOrigem = portaOrigem;
    }

    public short getSequencia() {
        return sequencia;
    }

    public void setSequencia(short sequencia) {
        this.sequencia = sequencia;
    }
    
}
